import pygame
from EventManagement import EventUser
from CoreEvents import LogEvent, QuitRequestEvent, AppQuitEvent, TickEvent, AppStartEvent

################################################################################
#
#
class Ticker(EventUser):
    
    ############################################################################
    # Constructor
    #
    # param - nFrameRate (default = 20) Ticker will broadcast ticks at this
    #    framerate
    #
    def __init__(self, nFrameRate=20):
        
        # Initialise member variables
        self._bKeepTicking = True
        self._nNextTick = 0                 # Time after process began that next tick will take place
        self._nDelay = 1000 / nFrameRate    # Delay between each tick (milliseconds)
        
        # Add event callbacks
        self.RegisterEvent(QuitRequestEvent, self.QuitRequest)
    ############################################################################
    
    ############################################################################
    # QuitRequest - Something has requested that the application end
    #
    def QuitRequest(self, rEvent):
        self._bKeepTicking = False
    ############################################################################
    
    ############################################################################
    # Initiate - Starts the Ticker
    #
    def Initiate(self):
        self.SendEvent(LogEvent({
            'nLogLevel' : 0, 
            'sMessage' : "Ticker started"
        }))
        
        self.SendEvent(AppStartEvent())
        
        while(self._bKeepTicking):
            # Send tick if enough time has passed
            if pygame.time.get_ticks() >= self._nNextTick: self._Tick()
        
        # About to exit, let Event Listeners know
        self.SendEvent(LogEvent({
            'nLogLevel' : 0, 
            'sMessage' : "That's enough. Quitting'..."
        }))
        self.SendEvent(AppQuitEvent())
    ############################################################################
    
    ############################################################################
    # Tick - Carries out the actions required in a single game Tick
    #
    def _Tick(self):
        self.SendEvent(LogEvent({
            'nLogLevel' : 0, 
            'sMessage' : "Ticker Ticking..."
        }))
        self._nNextTick += self._nDelay
        self.SendEvent(TickEvent())
    ############################################################################
################################################################################
